package com.kx.ssm.controller;

import com.kx.ssm.pojo.User;
import com.kx.ssm.utils.ExecutorUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

/**
 * 文件的上传
 * @ClassName FileController
 * @Author Sun
 * @Date 2021/5/23 12:32
 */
@Controller
@RequestMapping("/files")
public class FileController {
    @Autowired
    private ApplicationContext applicationContext;

    /**
     *
     * @param file 前端传过来的file
     * @param request
     * @param session
     * @return  返回文件的地址
     */
    @PostMapping("/upload")
    @ResponseBody
    public String uploadFile(MultipartFile file, HttpServletRequest request, HttpSession session){
        //保存文件,就是保存到什么地方,叫什么名字
        //文件上传需要 io 读写,属于耗时操作,能不能改成异步?
        //保存到我们指定的地址中，把文件保存在webapp下的files文件夹下
        ServletContext context = request.getServletContext();
        //获取真实路径
        String path = context.getRealPath("files");
        //创建文件路径
        File filePath = new File(path);
        if(!filePath.exists()){
            filePath.mkdirs();
        }

        //存储文件名使用uuid随机数
        String name = UUID.randomUUID().toString().replace("-", "");
        //获取前台上传文件的文件名，主要目的是为了获取文件后缀
        String uploadFileName = file.getOriginalFilename();
        String extName = uploadFileName.substring(uploadFileName.lastIndexOf("."));

        //文件存取的全路径
        String picRealPath = path+File.separator+name+ extName;

        //放到异步执行,每次创建线程很麻烦,所以放到线程池中

        ExecutorUtils.submit(()->{
            try {
                file.transferTo(new File(picRealPath));
            } catch (IOException e) {
                e.printStackTrace();
                //上传文件出现的异常暂时不处理,因为我们有容错度
            }
        });


        //当前的请求有可能是用户单独更新照片发起的,也就是说在传完照片后我们需要给用户更新照片
        //首先需要判断是不是有用户登录,有登录的就是更新
        String picUrl = "/files" + File.separator + name + extName;
        //这个时候 session 中的用户属性中密码是没有值的
        User user = (User) session.getAttribute("user");
        if (user != null) {
            //更新头像地址
            user.setPicurl(picUrl);

            //当前操作的目的是上传保存文件,和更新用户本身没有任何直接关系
            //你更新用户成功与否,做不做这个事情,跟我们的操作没有半毛钱关系
            //所以更新用户的操作不能写在这里,但是我还必须得更新用户,所以使用事件处理机制，发布事件让外部捕获

            //发布事件
            applicationContext.publishEvent(user);
        }
        return  picUrl;
    }
}
